package com.scott.itcast.thread.lesson11;

import java.util.Random;

/**
 * 线程范围内的变量
 * 线程范围内的共享数据
 * 各自线程上的数据应该是独立的
 * 在线程范围内不管哪个模块去拿数据。拿到的都是同1份数据
 * 每个数据库connection都是一个独立的线程
 * 2个事务之间的connection不能相同
 * 2个线程之间不影响对象的数据和事务  
 * 这件事务在线程范围内搞定,不要去影响别的线程的事务 。
 * connection在线程内共享,在线程外独立
 */
public class ThreadLocalTest {

	static ThreadLocal<Integer> tl= new ThreadLocal<Integer>();
	static ThreadLocal<MyThreadScopeData> myData= new ThreadLocal<MyThreadScopeData>();
	
	public static void main(String[] args) {
		
		for(int i=0; i<2;i++){
			//new2个线程
			new Thread(new Runnable(){
				public void run() {
					int data =new Random().nextInt();
					System.out.println(Thread.currentThread().getName() +"准备好data的值为："+data);
					
					MyThreadScopeData entity = new MyThreadScopeData();
					entity.setAge(data);
					entity.setName("huanghoulin"+data);
					
					//把数据存到当前线程中
					tl.set(data);
					myData.set(entity);
					
					//A模块去取数据
					new A().get();
					
					//B模块去取数据
					new B().get();
				}
				
			}).start();
		}
		
		
		
	}
	
	//A模块
	static class A{
		public void get(){
			int data =tl.get();
			MyThreadScopeData entity = myData.get();
			System.out.println("A模块获取线程 "+Thread.currentThread().getName() +"准备好的data的值为："+data);
			System.out.println("A模块获取线程 "+Thread.currentThread().getName() +"准备好的data的值为："+data +" entity为："+entity);
		}
	}
	
	//B模块
	static class B{
		public void get(){
			int data =tl.get();
			MyThreadScopeData entity = myData.get();
			System.out.println("B模块获取线程 "+Thread.currentThread().getName() +"准备好的data的值为："+data);
			System.out.println("B模块获取线程 "+Thread.currentThread().getName() +"准备好的data的值为："+data +" entity为："+entity);
		}
	}

}


class MyThreadScopeData{
	
	private String name;
	private int    age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "MyThreadScopeData [name=" + name + ", age=" + age + "]";
	}
	
}


